<!DOCTYPE html>
<html lang="en">
  <head>
  <meta charset="utf-8" />
  <meta http-equiv="X-UA-Compatible" content="IE=edge">
  <meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0">
  <meta content="" name="keywords">

  <title> 基于Nginx部署Django - </title>
  <meta name="description" content="" />
  <meta property="og:title" content="基于Nginx部署Django" />
  <meta name="twitter:title" content="基于Nginx部署Django" />
  <meta name="description" content="在阿里云ESC服务器上通过Nginx和uwsgi部署Django项目.">
  <meta property="og:description" content="在阿里云ESC服务器上通过Nginx和uwsgi部署Django项目.">
  <meta name="twitter:description" content="在阿里云ESC服务器上通过Nginx和uwsgi部署Django项目.">
  <meta name="author" content="{Description { .Site.Author.name }}"/>
  <meta name="twitter:card" content="summary" />
  <meta property="og:url" content="https://systemime.github.io/blog/2019-08/%E5%9F%BA%E4%BA%8Enginx%E9%83%A8%E7%BD%B2django/" />
  <meta property="og:type" content="website" />
  <meta property="og:site_name" content="听风的小站" />

  <meta name="generator" content="Hugo 0.67.0" />
  <link rel="canonical" href="https://systemime.github.io/blog/2019-08/%E5%9F%BA%E4%BA%8Enginx%E9%83%A8%E7%BD%B2django/" />
  <link rel="alternate" href="https://systemime.github.io/index.xml" type="application/rss+xml" title="听风的小站">
  <script src="https://res.cloudinary.com/jimmysong/raw/upload/rootsongjc-hugo/jquery-1.12.4.min.js"></script>
  <link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/KaTeX/0.7.1/katex.min.css" integrity="sha384-wITovz90syo1dJWVh32uuETPVEtGigN07tkttEqPv+uR2SE/mbQcG7ATL28aI9H0" crossorigin="anonymous">
  <link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/font-awesome/4.7.0/css/font-awesome.min.css" />
  <link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/css/bootstrap.min.css" integrity="sha384-BVYiiSIFeK1dGmJRAkycuHAHRg32OmUcww7on3RYdg4Va+PmSTsz/K68vbdEjh4u" crossorigin="anonymous">
  
  
  <link rel="stylesheet" href="https://systemime.github.io/css/main.css" />
  <link rel="stylesheet" href="https://systemime.github.io/css/my.css" />
  <link rel="stylesheet" href="https://systemime.github.io/css/pace.css" />
  <link rel="stylesheet" href="https://cdn.plyr.io/3.4.7/plyr.css">
  <link rel="stylesheet" href="https://systemime.github.io/css/lightgallery.css" />
  <link rel="stylesheet" href="https://systemime.github.io/css/baguetteBox.css" />
  <link rel="stylesheet" href="https://systemime.github.io/css/search.css" />
  <link rel="stylesheet" href="https://systemime.github.io/css/reward.css" />
  <link rel="stylesheet" href="https://systemime.github.io/css/share.min.css" />
  <link rel="stylesheet" href="https://fonts.googleapis.com/css?family=Lora:400,700,400italic,700italic" />
  <link rel="stylesheet" href="https://fonts.googleapis.com/css?family=Open+Sans:300italic,400italic,600italic,700italic,800italic,400,300,600,700,800" />
  <link rel="stylesheet" href="https://systemime.github.io/css/pygment_highlights.css" />
  <link rel="stylesheet" href="https://systemime.github.io/css/highlight.min.css" />
  <link rel="stylesheet" href="https://systemime.github.io/css/toc.css" />
  <link rel="stylesheet" href="https://systemime.github.io/css/lightbox.css" />
  <link rel="stylesheet" href="https://systemime.github.io/live2d/css/live2d.css" />
  
  <link href="https://systemime.github.io/css/video-js.css" rel="stylesheet">


<meta name="baidu-site-verification" content="g8IYR9SNLF" />
<script>
var _hmt = _hmt || [];
(function() {
  var hm = document.createElement("script");
  hm.src = "https://hm.baidu.com/hm.js?cffe439e37449bb1c07ab26ab56484bb";
  var s = document.getElementsByTagName("script")[0]; 
  s.parentNode.insertBefore(hm, s);
})();
</script>

<link rel="stylesheet" href="https://systemime.github.io/css/prism.css" />









<script src="https://systemime.github.io/js/pace.min.js" data-no-instant></script>



<script src="https://systemime.github.io/js/instantclick.min.js" data-no-instant></script>
   <script data-no-instant>
   InstantClick.on('change', function(isInitialLoad) {
     if (isInitialLoad === false) {
       if (typeof MathJax !== 'undefined') 
         MathJax.Hub.Queue(["Typeset",MathJax.Hub]);
       if (typeof prettyPrint !== 'undefined') 
         prettyPrint();
       if (typeof _hmt !== 'undefined')  
         _hmt.push(['_trackPageview', location.pathname + location.search]);
       if (typeof ga !== 'undefined')  
           ga('send', 'pageview', location.pathname + location.search);
     }
   });
   InstantClick.init();
</script>




<script type="text/javascript" src="https://cdnjs.cloudflare.com/ajax/libs/gist-embed/2.7.1/gist-embed.min.js"></script>


<script async src="//pagead2.googlesyndication.com/pagead/js/adsbygoogle.js"></script>
<script>
  (adsbygoogle = window.adsbygoogle || []).push({
    google_ad_client: "ca-pub-3925981084585036",
    enable_page_level_ads: true
  });
</script>



<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/photoswipe/4.1.1/photoswipe.min.css" integrity="sha256-sCl5PUOGMLfFYctzDW3MtRib0ctyUvI9Qsmq2wXOeBY=" crossorigin="anonymous" />
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/photoswipe/4.1.1/default-skin/default-skin.min.css" integrity="sha256-BFeI1V+Vh1Rk37wswuOYn5lsTcaU96hGaI7OUVCLjPc=" crossorigin="anonymous" />



<div class="pswp" tabindex="-1" role="dialog" aria-hidden="true">

<div class="pswp__bg"></div>

<div class="pswp__scroll-wrap">
    
    <div class="pswp__container">
      <div class="pswp__item"></div>
      <div class="pswp__item"></div>
      <div class="pswp__item"></div>
    </div>
    
    <div class="pswp__ui pswp__ui--hidden">
    <div class="pswp__top-bar">
      
      <div class="pswp__counter"></div>
      <button class="pswp__button pswp__button--close" title="Close (Esc)"></button>
      <button class="pswp__button pswp__button--share" title="Share"></button>
      <button class="pswp__button pswp__button--fs" title="Toggle fullscreen"></button>
      <button class="pswp__button pswp__button--zoom" title="Zoom in/out"></button>
      
      
      <div class="pswp__preloader">
        <div class="pswp__preloader__icn">
          <div class="pswp__preloader__cut">
            <div class="pswp__preloader__donut"></div>
          </div>
        </div>
      </div>
    </div>
    <div class="pswp__share-modal pswp__share-modal--hidden pswp__single-tap">
      <div class="pswp__share-tooltip"></div>
    </div>
    <button class="pswp__button pswp__button--arrow--left" title="Previous (arrow left)">
    </button>
    <button class="pswp__button pswp__button--arrow--right" title="Next (arrow right)">
    </button>
    <div class="pswp__caption">
      <div class="pswp__caption__center"></div>
    </div>
    </div>
    </div>
</div>

</head>

  <body>
    <nav class="navbar navbar-default navbar-fixed-top navbar-custom">
  <div class="container-fluid">
    <div class="navbar-header">
      <button type="button" class="navbar-toggle" data-toggle="collapse" data-target="#main-navbar">
        <span class="sr-only">Toggle navigation</span>
        <span class="icon-bar"></span>
        <span class="icon-bar"></span>
        <span class="icon-bar"></span>
      </button>
      <a class="navbar-brand" href="https://systemime.github.io">听风的小站</a>
    </div>
    <div class="collapse navbar-collapse" id="main-navbar">
      <ul class="nav navbar-nav navbar-right">
        
          
            <li>
		    <a title="博客" href="https://systemime.github.io/blog/">博客</a>
              
              
            </li>
          
        
          
            <li>
		    <a title="片刻" href="https://systemime.github.io/moment/">片刻</a>
              
              
            </li>
          
        
          
            <li>
		    <a title="关于" href="https://systemime.github.io/about/">关于</a>
              
              
            </li>
          
        
          
            <li>
		    <a title="留言" href="https://systemime.github.io/message/">留言</a>
              
              
            </li>
          
        

        

        
        
      </ul>
    </div>

    <div class="avatar-container">
      <div class="avatar-img-border">
        
      </div>
    </div>

  </div>
</nav>






    
  
  
  




  

  <header class="header-section ">
    
    <div class="intro-header no-img">
      
      <div class="container">
        <div class="row">
          <div class="col-lg-12 col-md-12 col-md-offset-0">
            <div class="blog-heading">
                <h1 align="center">基于Nginx部署Django</h1>
                
                
            </div>
          </div>
        </div>
      </div>
    </div>
  </header>


    
<div class="container" role="main" itemscope itemtype="http://schema.org/Article">
    <div class="row">
        <div class="col-lg-8 col-lg-offset-2 col-md-10 col-md-offset-1">
            
            
            
<div>
    <section id="datecount">
        <h4 id="date"> Thu Aug 15, 2019</h4>
    </section>
    <h5 id="wc">2400 Words|Read in about 5 Min|本文总阅读量<span id="busuanzi_value_page_pv"></span>次</h5>
    <h5 id="tags">Tags: 
        
        <a href="https://systemime.github.iotags/django/">Django</a> &nbsp;
        
        <a href="https://systemime.github.iotags/nginx/">Nginx</a> &nbsp;
        
        <a href="https://systemime.github.iotags/uwsgi/">uwsgi</a> &nbsp;
        
        <a href="https://systemime.github.iotags/%E9%83%A8%E7%BD%B2/">部署</a> &nbsp;
    </h5>
</div>

            
            <article role="main" class="blog-post" itemprop="articleBody" id="content">
                
<aside class="toc">
    <div id='anchors-navbar'>
        <i class='fa fa-anchor'></i>
        <nav id="TableOfContents">
  <ul>
    <li><a href="#一部署原理">一、部署原理</a></li>
    <li><a href="#二nginx安装">二、Nginx安装</a></li>
    <li><a href="#三安装uwsgi">三、安装uwsgi</a></li>
    <li><a href="#四nginxuwsgidjango">四、Nginx+uwsgi+Django</a>
      <ul>
        <li></li>
      </ul>
    </li>
    <li><a href="#五结束">五、结束</a></li>
  </ul>
</nav>
    </div>
    
</aside>


                <h2 id="一部署原理">一、部署原理</h2>
<p>Django的部署可以有很多方式，采用nginx+uwsgi的方式是其中比较常见的一种方式。</p>
<p>在这种方式中，我们的通常做法是，将nginx作为服务器最前端，它将接收WEB的所有请求，统一管理请求。</p>
<p>nginx把所有静态请求自己来处理（这是NGINX的强项）。然后，NGINX将所有非静态请求通过uwsgi传递给Django，由Django来进行处理，从而完成一次WEB请求。</p>
<p>可见，uwsgi的作用就类似一个桥接器。起到桥梁的作用。</p>
<h2 id="二nginx安装">二、Nginx安装</h2>
<p><code>Nginx</code>是一款轻量级的Web服务器/反向代理服务器及电子邮件（IMAP/POP3）代理服务器，并在一个BSD-like 协议下发行。其特点是占有内存少，并发能力强，事实上nginx的并发能力确实在同类型的网页服务器中表现较好。</p>
<p>Nginx同样为当前非常流行的web服务器。利用其部署Django，我们在此也做简单的介绍。</p>
<p>Nginx官网：<a href="http://nginx.org/">http://nginx.org/</a></p>
<ul>
<li>在终端下安装<strong>nginx</strong></li>
</ul>
<pre><code>apt-get install nginx
</code></pre><ul>
<li>启动<strong>nginx</strong></li>
</ul>
<pre><code>/etc/init.d/nginx start  #启动
/etc/init.d/nginx stop  #关闭
/etc/init.d/nginx restart  #重启
# 或
systemctl start/stop/restart nginx
</code></pre><ul>
<li>修改Nginx默认端口号，打开 <code>/etc/nginx/nginx.conf</code> 文件，修改端口号。</li>
</ul>
<pre><code># 这里我的端口号为9000，默认为80
# server_name修改为0.0.0.0

    server {
        listen       9000 default_server;
        listen       [::]:80 default_server;
        server_name  0.0.0.0;
        root         /usr/share/nginx/html;

        # Load configuration files for the default server block.
        include /etc/nginx/default.d/*.conf;

        location / {
            include uwsgi_params;
            uwsgi_pass 127.0.0.1:8000;
            uwsgi_read_timeout 5;
        }

        location /static {
            expires 30d;
            autoindex on;
            add_header Cache-Control private;
            alias /opt/bloe/mbl/liuyanban2/static/;
        }

        error_page 404 /404.html;
            location = /40x.html {
        }

        error_page 500 502 503 504 /50x.html;
            location = /50x.html {
        }
    }
</code></pre><ul>
<li>
<p>重启nginx
重启nginx，访问<a href="http://%E5%A4%96%E7%BD%91IP:9000">http://外网IP:9000</a></p>
<p>比如像下面这样<br>
<img src="" alt="实例"></p>
<p>出现上图说明启动成功</p>
</li>
</ul>
<h2 id="三安装uwsgi">三、安装uwsgi</h2>
<ul>
<li>pip安装uwsgi</li>
</ul>
<pre><code>pip install uwsgi
</code></pre><ul>
<li>
<p>配置django与uwsgi连接，假设项目位置为：<code>/home/fnngj/pydj/myweb</code></p>
<pre><code>uwsgi --http :8001 --chdir /opt/bloe/mbl/liuyanban2/ --wsgi-file liuyanban2/wsgi.py --master --processes 4 --threads 2 --stats 0.0.0.0:60013
</code></pre><pre><code>
 最后的`0.0.0.0:60013` 表示外网，端口号自定义

</code></pre></li>
<li>
<p><strong>常用选项</strong></p>
<ul>
<li>
<p><code>http</code>： 协议类型和端口号</p>
</li>
<li>
<p><code>processes</code>： 开启的进程数量</p>
</li>
<li>
<p><code>workers</code>： 开启的进程数量，等同于processes（官网的说法是spawn the specified number ofworkers / processes）</p>
</li>
<li>
<p><code>chdir</code>： 指定运行目录（chdir to specified directory before apps loading）</p>
</li>
<li>
<p><code>wsgi-file</code>： 载入wsgi-file（load .wsgi file）</p>
</li>
<li>
<p><code>stats</code>： 在指定的地址上，开启状态服务（enable the stats server on the specified address）</p>
</li>
<li>
<p><code>threads</code>： 运行线程。由于GIL的存在，我觉得这个真心没啥用。（run each worker in prethreaded mode with the specified number of threads）</p>
</li>
<li>
<p><code>master</code>： 允许主进程存在（enable master process）</p>
</li>
<li>
<p><code>daemonize</code>： 使进程在后台运行，并将日志打到指定的日志文件或者udp服务器（daemonize uWSGI）。实际上最常用的，还是把运行记录输出到一个本地文件上。</p>
</li>
<li>
<p><code>pidfile</code>： 指定pid文件的位置，记录主进程的pid号。</p>
</li>
<li>
<p><code>vacuum</code>： 当服务器退出的时候自动清理环境，删除unix socket文件和pid文件（try to remove all of the generated file/sockets）</p>
</li>
</ul>
</li>
</ul>
<h2 id="四nginxuwsgidjango">四、Nginx+uwsgi+Django</h2>
<h4 id="1-配置wsgi">1. 配置wsgi</h4>
<p>工程项目文件目录树如下</p>
<pre><code>myweb/

├── manage.py

├── myweb/

│   ├── __init__.py

│   ├── settings.py

│   ├── urls.py

│   └── wsgi.py

└── myweb_uwsgi.ini
</code></pre><p>在我们通过Django创建myweb项目时，在子目录myweb下已经帮我们生成的 <code>wsgi.py</code>文件。</p>
<p>所以，我们只需要再创建<code>myweb_uwsgi.ini</code>配置文件即可，当然，uwsgi支持多种类型的配置文件，如xml，ini等。此处，使用ini类型的配置。</p>
<p><strong>注意，myweb是项目名</strong></p>
<pre><code># myweb_uwsgi.ini file
[uwsgi]

# Django-related settings

socket = :8000

# the base directory (full path)
# 项目位置
chdir           = /opt/bloe/mbl/liuyanban2

# Django s wsgi file
module          = liuyanban2.wsgi

# process-related settings
# master
master          = true

# maximum number of worker processes
processes       = 4

# ... with appropriate permissions - may be needed
# chmod-socket    = 664
# clear environment on exit
vacuum          = true
</code></pre><ul>
<li>
<p>socket  指定项目执行的端口号。</p>
</li>
<li>
<p>chdir   指定项目的目录。</p>
</li>
<li>
<p>module  myweb.wsgi ，可以这么来理解，对于myweb_uwsgi.ini文件来说，与它的平级的有一个myweb目录，这个目录下有一个wsgi.py文件。</p>
</li>
</ul>
<h4 id="2-测试uwsgi">2. 测试uwsgi</h4>
<p>接下来，切换到myweb项目目录下，通过uwsgi命令读取myweb_uwsgi.ini文件启动项目</p>
<pre><code>user@ubuntu:~$ cd /home/fnngj/pydj/myweb/
user@ubuntu:~/pydj/myweb$ uwsgi --ini myweb_uwsgi.ini 
[uWSGI] getting INI configuration from myweb_uwsgi.ini
*** Starting uWSGI 2.0.12 (32bit) on [Sat Mar 12 13:05:06 2016] ***
compiled with version: 4.8.4 on 26 January 2016 06:14:41
os: Linux-3.19.0-25-generic #26~14.04.1-Ubuntu SMP Fri Jul 24 21:18:00 UTC 2015
nodename: ubuntu
machine: i686
clock source: unix
detected number of CPU cores: 2
current working directory: /home/fnngj/pydj/myweb
detected binary path: /usr/local/bin/uwsgi
!!! no internal routing support, rebuild with pcre support !!!
chdir() to /home/fnngj/pydj/myweb
your processes number limit is 15962
your memory page size is 4096 bytes
detected max file descriptor number: 1024
lock engine: pthread robust mutexes
thunder lock: disabled (you can enable it with --thunder-lock)
uwsgi socket 0 bound to TCP address :8000 fd 3
Python version: 3.4.3 (default, Oct 14 2015, 20:37:06)  [GCC 4.8.4]
*** Python threads support is disabled. You can enable it with --enable-threads ***
Python main interpreter initialized at 0x8b52dc0
your server socket listen backlog is limited to 100 connections
your mercy for graceful operations on workers is 60 seconds
mapped 319920 bytes (312 KB) for 4 cores
*** Operational MODE: preforking ***
WSGI app 0 (mountpoint='') ready in 1 seconds on interpreter 0x8b52dc0 pid: 7158 (default app)
*** uWSGI is running in multiple interpreter mode ***
spawned uWSGI master process (pid: 7158)
spawned uWSGI worker 1 (pid: 7160, cores: 1)
spawned uWSGI worker 2 (pid: 7161, cores: 1)
spawned uWSGI worker 3 (pid: 7162, cores: 1)
spawned uWSGI worker 4 (pid: 7163, cores: 1)
</code></pre><h4 id="3-配置nginx">3. 配置nginx</h4>
<p>修改nginx.conf配置文件。打开/etc/nginx/nginx.conf文件，添加如下内容。</p>
<pre><code>server {
        listen       9000 default_server;
        listen       [::]:80 default_server;
        server_name  0.0.0.0;
        root         /usr/share/nginx/html;

        # Load configuration files for the default server block.
        include /etc/nginx/default.d/*.conf;

        location / {
            include uwsgi_params;
            uwsgi_pass 127.0.0.1:8000;
            uwsgi_read_timeout 5;
        }

        location /static {
            expires 30d;
            autoindex on;
            add_header Cache-Control private;
            alias /opt/bloe/mbl/liuyanban2/static/;
        }

        error_page 404 /404.html;
            location = /40x.html {
        }

        error_page 500 502 503 504 /50x.html;
            location = /50x.html {
        }
    }

</code></pre><p>实际前面几步中已经添加了</p>
<ul>
<li>
<p><code>listen</code> 指定的是nginx代理uwsgi对外的端口号。</p>
</li>
<li>
<p><code>server_name</code>  网上大多资料都是设置的一个网址（例，www.example.com），我这里如果设置成网址无法访问，所以，指定的到了本机默认ip，当然可以0.0.0.0，外网访问</p>
</li>
<li>
<p><code>include</code> 必须指定为<strong>uwsgi_params</strong>；而<code>uwsgi_pass</code>指的本机IP的端口号与<strong>myweb_uwsgi.ini</strong>配置中的文件中的必须一致。</p>
</li>
</ul>
<h4 id="4-测试nginx">4. 测试nginx</h4>
<p>现在重新启动nginx，翻看上面重启动nginx的命令。然后，访问：<a href="http://%E5%A4%96%E7%BD%91IP:9000/">http://外网IP:9000/</a></p>
<p>通过这个IP和端口号的指向，请求应该是先到nginx的。如果你在页面上执行一些请求，就会看到，这些请求最终会转到uwsgi来处理。</p>
<h2 id="五结束">五、结束</h2>

                <br />
                <div style="text-align:center;color: #ccc;font-size:16px;font-family: cursive;">-------他日江湖相逢 <i class="fa fa-umbrella"></i> 再当杯酒言欢-------</div>
                <script src="https://systemime.github.io/js/particle.js"></script>
                
                
                <div class="social-share" data-initialized="true" data-wechat-qrcode-title="不扫别后悔">
    <center>
    <font style="font-size:18px;color:darkcyan;">分享到：</font>
    <a href="#" class="social-share-icon icon-weibo"></a>
    <a href="#" class="social-share-icon icon-wechat"></a>
    <a href="#" class="social-share-icon icon-twitter"></a>
    <a href="#" class="social-share-icon icon-linkedin"></a>
    <a href="#" class="social-share-icon icon-facebook"></a>
    <a href="#" class="social-share-icon icon-qq"></a>
    </center>
</div>


<script src="https://hugo-picture.oss-cn-beijing.aliyuncs.com/social-share.min.js"></script>

                
            </article>

            <ul class="pager blog-pager">
                
                <li class="previous">
                    <a href="https://systemime.github.io/blog/2019-08/centos7.4%E4%B8%ADiptables%E5%92%8Cfirewalld%E7%9A%84%E4%B8%80%E4%BA%9B%E6%93%8D%E4%BD%9C/" data-toggle="tooltip" data-placement="top" title="Centos7.4中iptables和firewalld的一些操作">&larr; Previous Post</a>
                </li>
                 
                <li class="next">
                    <a href="https://systemime.github.io/blog/2019-08/linux-%E4%B8%80%E6%AC%A1%E6%80%A7%E5%AE%9A%E6%97%B6%E4%BB%BB%E5%8A%A1-at/" data-toggle="tooltip" data-placement="top" title="Linux 一次性定时任务 —— at">Next Post &rarr;</a>
                </li>
                
            </ul>
            
            <div>
                 
                <h2>相关文章</h2>
                <ul>
                    
                    <li><a href="https://systemime.github.io/blog/2019-08/django%E8%A7%A3%E5%86%B3%E8%B7%A8%E5%9F%9F%E9%97%AE%E9%A2%98/">Django解决跨域问题</a></li>
                    
                    <li><a href="https://systemime.github.io/blog/2019-05/django%E5%B8%B8%E7%94%A8%E8%AF%AD%E6%B3%95/">Django——常用语法</a></li>
                    
                    <li><a href="https://systemime.github.io/blog/2019-05/django%E5%85%B3%E9%97%ADdegug%E5%BD%B1%E5%93%8Dcss%E6%A0%B7%E5%BC%8F%E5%8F%97%E5%BD%B1%E5%93%8D/">Django关闭DEGUG影响css样式受影响</a></li>
                    
                    <li><a href="https://systemime.github.io/blog/2019-04/django%E5%AE%9E%E7%8E%B0%E7%AE%80%E5%8D%95%E7%BD%91%E9%A1%B5%E5%BC%B9%E5%87%BA%E8%AD%A6%E5%91%8A/">Django实现简单网页弹出警告</a></li>
                    
                    <li><a href="https://systemime.github.io/blog/2019-04/django%E8%8E%B7%E5%8F%96%E6%8C%87%E5%AE%9A%E5%88%97%E7%9A%84%E6%95%B0%E6%8D%AE/">Django获取指定列的数据</a></li>
                    
                </ul>
                
            </div>
            
            
            
              
            
            </div>
        </div>
        <div class="col-lg-8 col-lg-offset-2 col-md-10 col-md-offset-1">
            
            
        </div>
    </div>
    </section>
</div>

    <div class="rocket"><img src="https://systemime.github.io/img/rocket_up.png" alt="" width="100" height="100"></div>
<script>
    $(function () {
      $(window).scroll(function () {
        
        if ($(window).scrollTop() >= 1000) {
          $('.rocket').stop().fadeIn(1000);
        }else {
          $('.rocket').stop().fadeOut(1000);
        }
      })
      
      $('.rocket').click(function () {
        $('html,body').stop().animate({scrollTop:0},400);
       
      })
    })

</script>

    
    <div id="landlord">
        <div class="message" style="opacity:0"></div>
        <canvas id="live2d" width="280" height="250" class="live2d"></canvas>
        <div class="hide-button">隐藏</div>
    </div>
    
    <footer id="copyright">
  <div class="container">
    <div class="row">
      <div class="col-lg-8 col-lg-offset-2 col-md-10 col-md-offset-1">
        <ul class="list-inline text-center footer-links">
          
          
        </ul>
        <p class="credits copyright text-muted">
        &copy;2017-2018
          
          &nbsp;&bull;&nbsp;
          September 20,2019
          updated
          
            &nbsp;&bull;&nbsp;
            <a href="https://systemime.github.io">Home</a>
          
        </p>

        <p class="credits theme-by text-muted">
        <a href="https://servicemesher.github.io" target="_blank">ServiceMesher</a>&nbsp;&bull;&nbsp;<a href="https://github.com/yangchuansheng/k8s-knowledge" target="_blank">Kubernetes 知识图谱</a>
        <br />
        <span id="busuanzi_container_site_pv">
            本站已被访问 <span id="busuanzi_value_site_pv"></span> 次啦
        </span>
        <span id="busuanzi_container_site_uv">
            &ensp;|&ensp;&thinsp;您是第 <span id="busuanzi_value_site_uv"></span> 位到访的小伙伴喔
        </span>
        </p>
        
        <p class="credits theme-by text-muted">
          <a href="http://gohugo.io">Hugo v0.67.0</a> powered &nbsp;&bull;&nbsp; Theme by <a href="http://deanattali.com/beautiful-jekyll/">Beautiful Jekyll</a> adapted to <a href="https://github.com/halogenica/beautifulhugo">Beautiful Hugo</a>
          
          <center><section class="credits theme-by text-muted">
    <span class="footer__copyright">
    <div>
    <span id="span_dt_dt"> </span>
    <script language="javascript">
      function show_date_time(){
        window.setTimeout("show_date_time()", 1000);
        BirthDay=new Date("7/8/2017 10:56:12");
        today=new Date();
        timeold=(today.getTime()-BirthDay.getTime());
        sectimeold=timeold/1000
        secondsold=Math.floor(sectimeold);
        msPerDay=24*60*60*1000
        e_daysold=timeold/msPerDay
        daysold=Math.floor(e_daysold);
        e_hrsold=(e_daysold-daysold)*24;
        hrsold=Math.floor(e_hrsold);
        e_minsold=(e_hrsold-hrsold)*60;
        minsold=Math.floor((e_hrsold-hrsold)*60);
        seconds=Math.floor((e_minsold-minsold)*60);
        span_dt_dt.innerHTML="本博客已经开心运行 "+daysold+" 天 "+hrsold+" 小时 "+minsold+" 分 "+seconds+" 秒";
      }
      show_date_time();
    </script>
    </div>
</script>
</section>
</center>
        </p>
      </div>
    </div>
  </div>
</footer>


<script src="https://res.cloudinary.com/jimmysong/raw/upload/rootsongjc-hugo/bootstrap.min.js"></script>
<script src="https://res.cloudinary.com/jimmysong/raw/upload/rootsongjc-hugo/photoswipe-ui-default.min.js"></script>
<script src="https://res.cloudinary.com/jimmysong/raw/upload/rootsongjc-hugo/photoswipe.min.js"></script>
<script src="https://res.cloudinary.com/jimmysong/raw/upload/rootsongjc-hugo/auto-render.min.js"></script>
<script src="https://systemime.github.io/js/main.js"></script>
<script src="https://systemime.github.io/js/clipboard.min.js"></script>
<script src="https://systemime.github.io/js/prism.js?t=123"></script>
<script src="https://systemime.github.io/js/highlight.min.js"></script>
<script src="https://res.cloudinary.com/jimmysong/raw/upload/rootsongjc-hugo/katex.min.js"></script>
<script src="https://systemime.github.io/js/reward.js"></script>
<script src="https://systemime.github.io/js/canvas_ribbon.js"></script>
<script> renderMathInElement(document.body); </script>

<script src="https://systemime.github.io/js/baguetteBox.js"></script>
<script> baguetteBox.run('.gallery');</script>






<script async defer src="https://buttons.github.io/buttons.js"></script>


<script src="https://polyfill.io/v2/polyfill.min.js?features=IntersectionObserver"></script>
<script type="text/javascript" src="https://systemime.github.io/js/quicklink.umd.js"></script>
<script>
window.addEventListener('load', () =>{
   quicklink();
});
</script>



<script type="text/javascript">
 
var a_idx = 0;
jQuery(document).ready(function($) {
    $("body").click(function(e) {
        var a = new Array("Docker", "Kubernetes", "Prometheus", "Envoy", "Istio", "Service Mesh", "Cloud Native");
        var $i = $("<span />").text(a[a_idx]);
        a_idx = (a_idx + 1) % a.length;
        var x = e.pageX,
        y = e.pageY;
        function randomColor() {
          var flakeColor = new Array("#FFDA65", "#00BFFF", "#BA55D3", "#FFA07A", "#87CEEB", "#FFB6C1");
          var snowColor = flakeColor[Math.floor(flakeColor.length * Math.random())];
          return snowColor;
        }
        $i.css({
            "z-index": 999999999999999999999999999999999999999999999999999999999999999999999,
            "top": y - 20,
            "left": x,
            "position": "absolute",
            "font-weight": "bold",
            "color": randomColor()
        });
        $("body").append($i);
        $i.animate({
            "top": y - 180,
            "opacity": 0
        },
        1500,
        function() {
            $i.remove();
        });
    });
});
</script>


<script type="text/javascript" src="https://systemime.github.io/js/lightbox.js"></script>











<script src="https://cdn.plyr.io/3.4.7/plyr.js"></script>
<script>const player = new Plyr('#player');</script>


<script async defer src="https://buttons.github.io/buttons.js"></script>


  </body>
</html>

